package com.dc.trans.steps.xmltransfer;

import java.util.ArrayList;
import java.util.HashSet;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.fileinput.FileInputList;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMeta;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.core.dialog.EnterSelectionDialog;
import org.pentaho.di.ui.core.dialog.ErrorDialog;
import org.pentaho.di.ui.core.widget.ColumnInfo;
import org.pentaho.di.ui.core.widget.TableView;
import org.pentaho.di.ui.core.widget.TextVar;


public class CmpFileT extends Composite {

	//private static Class<?> PKG = XMLTransferDataMeta.class; // for i18n purposes, needed by Translator2!!   $NON-NLS-1$
	private static Class<?> PKG ;
	
	private PropsUI props;
	private TransMeta transMeta;
	private String stepname;
	private Shell shell;
	
	private FormData     fdFileComp;

	private Label        wlFilename,wlXMLIsAFile;
	private Button       wbbFilename; // Browse: add file or directory
	private Button       wbdFilename; // Delete
	private Button       wbeFilename; // Edit
	private Button       wbaFilename; // Add or change
	private TextVar      wFilename;
	private FormData     fdlFilename, fdbFilename, fdbdFilename, fdbeFilename, fdbaFilename, fdFilename;

	private Label        wlFilenameList;
	private TableView    wFilenameList;
	private FormData     fdlFilenameList, fdFilenameList;

	private Label        wlFilemask;
	private TextVar      wFilemask;
	private FormData     fdlFilemask, fdFilemask;

	private Button       wbShowFiles;
	private FormData     fdbShowFiles;
	
//	private Label        wluseToken;
//	private Button       wuseToken;
//	private FormData     fdluseToken, fduseToken;
	

	private FormData fdlXMLField, fdlXMLStreamField,fdlXMLIsAFile;
	private FormData    fdXMLField, fdXSDFileField;
	private FormData fdOutputField,fdXMLIsAFile,fdAdditionalFields,fdAddFileResult,fdXmlConf;
	private Label wlXMLField, wlXmlStreamField;
	private CCombo wXMLField;
	private Button wXMLStreamField,wXMLIsAFile;
 

//	private Label        wlInclFilename;
//	private Button       wInclFilename,wAddResult;
//	private FormData     fdlInclFilename, fdInclFilename,fdAddResult,fdlAddResult;
	
//	private Label        wlNameSpaceAware;
//	private Button       wNameSpaceAware;
//	private FormData     fdlNameSpaceAware, fdNameSpaceAware;
	
	private Label        wlreadUrl;
	private Button       wreadUrl;
	private FormData     fdlreadUrl, fdreadUrl;
	
//	private Label        wlIgnoreComment;
//	private Button       wIgnoreComment;
//	private FormData     fdlIgnoreComment, fdIgnoreComment;
	
//	private Label        wlValidating;
//	private Button       wValidating;
//	private FormData     fdlValidating, fdValidating;
	
//	private Label        wlInclFilenameField;
//	private TextVar      wInclFilenameField;
//	private FormData     fdlInclFilenameField, fdInclFilenameField;

//	private Label        wlInclRownum,wlAddResult;
//	private Button       wInclRownum;
//	private FormData     fdlInclRownum, fdRownum;
//
//	private Label        wlInclRownumField;
//	private TextVar      wInclRownumField;
//	private FormData     fdlInclRownumField, fdInclRownumField;
//	
//	private Label        wlLimit;
//	private Text         wLimit;
//	private FormData     fdlLimit, fdLimit;

//    private Label        wlLoopXPath;
//    private TextVar      wLoopXPath;
//    private FormData     fdlLoopXPath, fdLoopXPath;
// 
//    private Label        wlPrunePath;
//    private TextVar      wPrunePath;
//    private FormData     fdlPrunePath, fdPrunePath;
//    
//    private Label        wlEncoding;
//    private CCombo       wEncoding;
//    private FormData     fdlEncoding, fdEncoding;
//
//   
//	private TableView    wFields;
//	private FormData     fdFields;
	
	private Group wOutputField;
//	private Group wAdditionalFields;
//	private Group wAddFileResult;
//	private Group wXmlConf;
	
//	private Button   wbbLoopPathList;
//	private FormData fdbLoopPathList;
	
	private Label wlExcludeFilemask;
	private TextVar wExcludeFilemask;
	private FormData fdlExcludeFilemask, fdExcludeFilemask;
	
	// ignore empty files flag
//	private Label        wlIgnoreEmptyFile;
//	private Button       wIgnoreEmptyFile;
//	private FormData     fdlIgnoreEmptyFile, fdIgnoreEmptyFile;
//	

//	 // do not fail if no files?
//	private Label        wldoNotFailIfNoFile;
//	private Button       wdoNotFailIfNoFile;
//	private FormData     fdldoNotFailIfNoFile, fddoNotFailIfNoFile;
//
//	 private CTabItem     wAdditionalFieldsTab;
//	    private Composite   wAdditionalFieldsComp;
//	    private FormData	fdAdditionalFieldsComp;
//	    
//	    private Label	    wlShortFileFieldName;
//	    private FormData	fdlShortFileFieldName;
//	    private TextVar		wShortFileFieldName;
//	    private FormData    fdShortFileFieldName;
//	    private Label	    wlPathFieldName;
//	    private FormData	fdlPathFieldName;
//	    private TextVar		wPathFieldName;
//	    private FormData    fdPathFieldName;
//
//	    private Label	    wlIsHiddenName;
//	    private FormData	fdlIsHiddenName;
//	    private TextVar		wIsHiddenName;
//	    private FormData    fdIsHiddenName;
//	    private Label	    wlLastModificationTimeName;
//	    private FormData	fdlLastModificationTimeName;
//	    private TextVar		wLastModificationTimeName;
//	    private FormData    fdLastModificationTimeName;
//	    private Label	    wlUriName;
//	    private FormData	fdlUriName;
//	    private TextVar		wUriName;
//	    private FormData    fdUriName;
//	    private Label	    wlRootUriName;
//	    private FormData	fdlRootUriName;
//	    private TextVar		wRootUriName;
//	    private FormData    fdRootUriName;
//	    private Label	    wlExtensionFieldName;
//	    private FormData	fdlExtensionFieldName;
//	    private TextVar		wExtensionFieldName;
//	    private FormData    fdExtensionFieldName;
//	    private Label	    wlSizeFieldName;
//	    private FormData	fdlSizeFieldName;
//	    private TextVar		wSizeFieldName;
//	    private FormData    fdSizeFieldName;
	
	private XMLTransferDataMeta input;
	
	private int middle;
	private int margin;
	private ModifyListener lsMod;
	
//	private boolean  gotEncodings = false;
//	
//	private     HashSet<String> list = new HashSet<String> ();
	
	public static final int dateLengths[] = new int[]
		{
			23, 19, 14, 10, 10, 10, 10, 8, 8, 8, 8, 6, 6
		}
		;
	
	ArrayList<String> listpath = new ArrayList<String>();
	String precNodeName=null;


	public CmpFileT(Composite cmp, int type, 
			PropsUI _props, Class<?> _PKG, TransMeta _transMeta, String _stepname,
			Shell _shell, XMLTransferDataMeta _input)
	{
		super(cmp, type);
		props = _props;
		PKG = _PKG;
		transMeta = _transMeta;
		stepname = _stepname;
		shell = _shell;
		input =_input;
		
		open_init();
	}
	
	public void open_init()
	{
		lsMod = new ModifyListener() 
		{
			public void modifyText(ModifyEvent e) 
			{
				input.setChanged();
			}
		};
		FormLayout fileLayout = new FormLayout();
		fileLayout.marginWidth  = 3;
		fileLayout.marginHeight = 3;
		this.setLayout(fileLayout);

		middle = props.getMiddlePct();
		margin = Const.MARGIN;
		// ///////////////////////////////
		// START OF Output Field GROUP  //
		///////////////////////////////// 

		wOutputField = new Group(this, SWT.SHADOW_NONE);
		props.setLook(wOutputField);
		wOutputField.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.wOutputField.Label"));
		
		FormLayout outputfieldgroupLayout = new FormLayout();
		outputfieldgroupLayout.marginWidth = 10;
		outputfieldgroupLayout.marginHeight = 10;
		wOutputField.setLayout(outputfieldgroupLayout);
		
		//Is XML string defined in a Field		
		wlXmlStreamField = new Label(wOutputField, SWT.RIGHT);
		wlXmlStreamField.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.wlXmlStreamField.Label"));
		props.setLook(wlXmlStreamField);
		fdlXMLStreamField = new FormData();
		fdlXMLStreamField.left = new FormAttachment(0, -margin);
		fdlXMLStreamField.top = new FormAttachment(0, margin);
		fdlXMLStreamField.right = new FormAttachment(middle, -2*margin);
		wlXmlStreamField.setLayoutData(fdlXMLStreamField);
		
		
		wXMLStreamField = new Button(wOutputField, SWT.CHECK);
		props.setLook(wXMLStreamField);
		wXMLStreamField.setToolTipText(BaseMessages.getString(PKG, "GetXMLDataDialog.wXmlStreamField.Tooltip"));
		fdXSDFileField = new FormData();
		fdXSDFileField.left = new FormAttachment(middle, -margin);
		fdXSDFileField.top = new FormAttachment(0, margin);
		wXMLStreamField.setLayoutData(fdXSDFileField);		
		SelectionAdapter lsxmlstream = new SelectionAdapter()
        {
            public void widgetSelected(SelectionEvent arg0)
            {
            	ActiveXmlStreamField();
            	input.setChanged();
            }
        };
        wXMLStreamField.addSelectionListener(lsxmlstream);
        
        
        
        //Is XML source is a file?		
		wlXMLIsAFile = new Label(wOutputField, SWT.RIGHT);
		wlXMLIsAFile.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.XMLIsAFile.Label"));
		props.setLook(wlXMLIsAFile);
		fdlXMLIsAFile = new FormData();
		fdlXMLIsAFile.left = new FormAttachment(0, -margin);
		fdlXMLIsAFile.top = new FormAttachment(wXMLStreamField, margin);
		fdlXMLIsAFile.right = new FormAttachment(middle, -2*margin);
		wlXMLIsAFile.setLayoutData(fdlXMLIsAFile);
		
		wXMLIsAFile = new Button(wOutputField, SWT.CHECK);
		props.setLook(wXMLIsAFile);
		wXMLIsAFile.setToolTipText(BaseMessages.getString(PKG, "GetXMLDataDialog.XMLIsAFile.Tooltip"));
		fdXMLIsAFile = new FormData();
		fdXMLIsAFile.left = new FormAttachment(middle, -margin);
		fdXMLIsAFile.top = new FormAttachment(wXMLStreamField, margin);
		wXMLIsAFile.setLayoutData(fdXMLIsAFile);
		SelectionAdapter lsxmlisafile = new SelectionAdapter()
        {
            public void widgetSelected(SelectionEvent arg0)
            {
        		if(wXMLIsAFile.getSelection())
        			wreadUrl.setSelection(false);
            	input.setChanged();
            }
        };
        wXMLIsAFile.addSelectionListener(lsxmlisafile);
        
        // read url as source ?
		wlreadUrl=new Label(wOutputField, SWT.RIGHT);
		wlreadUrl.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.readUrl.Label"));
 		props.setLook(wlreadUrl);
		fdlreadUrl=new FormData();
		fdlreadUrl.left = new FormAttachment(0, -margin);
		fdlreadUrl.top  = new FormAttachment(wXMLIsAFile, margin);
		fdlreadUrl.right= new FormAttachment(middle, -2*margin);
		wlreadUrl.setLayoutData(fdlreadUrl);
		wreadUrl=new Button(wOutputField, SWT.CHECK );
 		props.setLook(wreadUrl);
		wreadUrl.setToolTipText(BaseMessages.getString(PKG, "GetXMLDataDialog.readUrl.Tooltip"));
		fdreadUrl=new FormData();
		fdreadUrl.left = new FormAttachment(middle, -margin);
		fdreadUrl.top  = new FormAttachment(wXMLIsAFile, margin);
		wreadUrl.setLayoutData(fdreadUrl);
		SelectionAdapter lsreadurl = new SelectionAdapter()
        {
            public void widgetSelected(SelectionEvent arg0)
            {
        		if(wreadUrl.getSelection())
        			wXMLIsAFile.setSelection(false);
            	input.setChanged();
            }
        };
        wreadUrl.addSelectionListener(lsreadurl);
        
		// If XML string defined in a Field
		wlXMLField=new Label(wOutputField, SWT.RIGHT);
        wlXMLField.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.wlXMLField.Label"));
        props.setLook(wlXMLField);
        fdlXMLField=new FormData();
        fdlXMLField.left = new FormAttachment(0, -margin);
        fdlXMLField.top  = new FormAttachment(wreadUrl, margin);
        fdlXMLField.right= new FormAttachment(middle, -2*margin);
        wlXMLField.setLayoutData(fdlXMLField);
        
        
        wXMLField=new CCombo(wOutputField, SWT.BORDER | SWT.READ_ONLY);
        wXMLField.setEditable(true);
        props.setLook(wXMLField);
        wXMLField.addModifyListener(lsMod);
        fdXMLField=new FormData();
        fdXMLField.left = new FormAttachment(middle, -margin);
        fdXMLField.top  = new FormAttachment(wreadUrl, margin);
        fdXMLField.right= new FormAttachment(100, -margin);
        wXMLField.setLayoutData(fdXMLField);
        wXMLField.addFocusListener(new FocusListener()
            {
                public void focusLost(org.eclipse.swt.events.FocusEvent e)
                {
                }
            
                public void focusGained(org.eclipse.swt.events.FocusEvent e)
                {
                    Cursor busy = new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT);
                    shell.setCursor(busy);
                    setXMLStreamField();
                    shell.setCursor(null);
                    busy.dispose();
                }
            }
        );           	
        
		fdOutputField = new FormData();
		fdOutputField.left = new FormAttachment(0, margin);
		fdOutputField.top = new FormAttachment(wFilenameList, margin);
		fdOutputField.right = new FormAttachment(100, -margin);
		wOutputField.setLayoutData(fdOutputField);
		
		// ///////////////////////////////////////////////////////////
		// / END OF Output Field GROUP
		// ///////////////////////////////////////////////////////////		

		// Filename line
		wlFilename=new Label(this, SWT.RIGHT);
		wlFilename.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.Filename.Label"));
 		props.setLook(wlFilename);
		fdlFilename=new FormData();
		fdlFilename.left = new FormAttachment(0, 0);
		fdlFilename.top  = new FormAttachment(wOutputField, margin);
		fdlFilename.right= new FormAttachment(middle, -margin);
		wlFilename.setLayoutData(fdlFilename);

		wbbFilename=new Button(this, SWT.PUSH| SWT.CENTER);
 		props.setLook(wbbFilename);
		wbbFilename.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.FilenameBrowse.Button"));
		wbbFilename.setToolTipText(BaseMessages.getString(PKG, "System.Tooltip.BrowseForFileOrDirAndAdd"));
		fdbFilename=new FormData();
		fdbFilename.right= new FormAttachment(100, 0);
		fdbFilename.top  = new FormAttachment(wOutputField, margin);
		wbbFilename.setLayoutData(fdbFilename);

		wbaFilename=new Button(this, SWT.PUSH| SWT.CENTER);
 		props.setLook(wbaFilename);
		wbaFilename.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.FilenameAdd.Button"));
		wbaFilename.setToolTipText(BaseMessages.getString(PKG, "GetXMLDataDialog.FilenameAdd.Tooltip"));
		fdbaFilename=new FormData();
		fdbaFilename.right= new FormAttachment(wbbFilename, -margin);
		fdbaFilename.top  = new FormAttachment(wOutputField, margin);
		wbaFilename.setLayoutData(fdbaFilename);

		wFilename=new TextVar(transMeta,this, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
 		props.setLook(wFilename);
		wFilename.addModifyListener(lsMod);
		fdFilename=new FormData();
		fdFilename.left = new FormAttachment(middle, 0);
		fdFilename.right= new FormAttachment(wbaFilename, -margin);
		fdFilename.top  = new FormAttachment(wOutputField, margin);
		wFilename.setLayoutData(fdFilename);

		wlFilemask=new Label(this, SWT.RIGHT);
		wlFilemask.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.RegExp.Label"));
 		props.setLook(wlFilemask);
		fdlFilemask=new FormData();
		fdlFilemask.left = new FormAttachment(0, 0);
		fdlFilemask.top  = new FormAttachment(wFilename, margin);
		fdlFilemask.right= new FormAttachment(middle, -margin);
		wlFilemask.setLayoutData(fdlFilemask);
		wFilemask=new TextVar(transMeta,this, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
 		props.setLook(wFilemask);
		wFilemask.addModifyListener(lsMod);
		fdFilemask=new FormData();
		fdFilemask.left = new FormAttachment(middle, 0);
		fdFilemask.top  = new FormAttachment(wFilename, margin);
		fdFilemask.right= new FormAttachment(100, 0);
		wFilemask.setLayoutData(fdFilemask);
		
		
		wlExcludeFilemask = new Label(this, SWT.RIGHT);
		wlExcludeFilemask.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.ExcludeFilemask.Label"));
		props.setLook(wlExcludeFilemask);
		fdlExcludeFilemask = new FormData();
		fdlExcludeFilemask.left = new FormAttachment(0, 0);
		fdlExcludeFilemask.top = new FormAttachment(wFilemask, margin);
		fdlExcludeFilemask.right = new FormAttachment(middle, -margin);
		wlExcludeFilemask.setLayoutData(fdlExcludeFilemask);
		wExcludeFilemask = new TextVar(transMeta, this, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
		props.setLook(wExcludeFilemask);
		wExcludeFilemask.addModifyListener(lsMod);
		fdExcludeFilemask = new FormData();
		fdExcludeFilemask.left = new FormAttachment(middle, 0);
		fdExcludeFilemask.top = new FormAttachment(wFilemask, margin);
		fdExcludeFilemask.right = new FormAttachment(wFilename, 0, SWT.RIGHT);
		wExcludeFilemask.setLayoutData(fdExcludeFilemask);


		// Filename list line
		wlFilenameList=new Label(this, SWT.RIGHT);
		wlFilenameList.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.FilenameList.Label"));
 		props.setLook(wlFilenameList);
		fdlFilenameList=new FormData();
		fdlFilenameList.left = new FormAttachment(0, 0);
		fdlFilenameList.top  = new FormAttachment(wExcludeFilemask, margin);
		fdlFilenameList.right= new FormAttachment(middle, -margin);
		wlFilenameList.setLayoutData(fdlFilenameList);

		// Buttons to the right of the screen...
		wbdFilename=new Button(this, SWT.PUSH| SWT.CENTER);
 		props.setLook(wbdFilename);
		wbdFilename.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.FilenameRemove.Button"));
		wbdFilename.setToolTipText(BaseMessages.getString(PKG, "GetXMLDataDialog.FilenameRemove.Tooltip"));
		fdbdFilename=new FormData();
		fdbdFilename.right = new FormAttachment(100, 0);
		fdbdFilename.top  = new FormAttachment (wExcludeFilemask, 40);
		wbdFilename.setLayoutData(fdbdFilename);

		wbeFilename=new Button(this, SWT.PUSH| SWT.CENTER);
 		props.setLook(wbeFilename);
		wbeFilename.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.FilenameEdit.Button"));
		wbeFilename.setToolTipText(BaseMessages.getString(PKG, "GetXMLDataDialog.FilenameEdit.Tooltip"));
		fdbeFilename=new FormData();
		fdbeFilename.right = new FormAttachment(100, 0);
		fdbeFilename.left  = new FormAttachment(wbdFilename, 0, SWT.LEFT);
		fdbeFilename.top   = new FormAttachment (wbdFilename, margin);
		wbeFilename.setLayoutData(fdbeFilename);

		wbShowFiles=new Button(this, SWT.PUSH| SWT.CENTER);
 		props.setLook(wbShowFiles);
		wbShowFiles.setText(BaseMessages.getString(PKG, "GetXMLDataDialog.ShowFiles.Button"));
		fdbShowFiles=new FormData();
		fdbShowFiles.left   = new FormAttachment(middle, 0);
		fdbShowFiles.bottom = new FormAttachment(100, 0);
		wbShowFiles.setLayoutData(fdbShowFiles);

		ColumnInfo[] colinfo=new ColumnInfo[5];
		colinfo[ 0]=new ColumnInfo( BaseMessages.getString(PKG, "GetXMLDataDialog.Files.Filename.Column"), ColumnInfo.COLUMN_TYPE_TEXT, false);
		colinfo[ 1]=new ColumnInfo( BaseMessages.getString(PKG, "GetXMLDataDialog.Files.Wildcard.Column"),ColumnInfo.COLUMN_TYPE_TEXT, false );
		colinfo[ 2]=new ColumnInfo(BaseMessages.getString(PKG, "GetXMLDataDialog.Files.ExcludeWildcard.Column"),ColumnInfo.COLUMN_TYPE_TEXT, false);
		
		colinfo[0].setUsingVariables(true);
		colinfo[1].setUsingVariables(true);
		colinfo[1].setToolTip(BaseMessages.getString(PKG, "GetXMLDataDialog.Files.Wildcard.Tooltip"));
		colinfo[2].setUsingVariables(true);
		colinfo[2].setToolTip(BaseMessages.getString(PKG, "GetXMLDataDialog.Files.ExcludeWildcard.Tooltip"));
		colinfo[3]=new ColumnInfo(BaseMessages.getString(PKG, "GetXMLDataDialog.Required.Column"),ColumnInfo.COLUMN_TYPE_CCOMBO,  XMLTransferDataMeta.RequiredFilesDesc);
		colinfo[3].setToolTip(BaseMessages.getString(PKG, "GetXMLDataDialog.Required.Tooltip"));
		colinfo[4]=new ColumnInfo(BaseMessages.getString(PKG, "GetXMLDataDialog.IncludeSubDirs.Column"), ColumnInfo.COLUMN_TYPE_CCOMBO,  XMLTransferDataMeta.RequiredFilesDesc );
		colinfo[4].setToolTip(BaseMessages.getString(PKG, "GetXMLDataDialog.IncludeSubDirs.Tooltip"));		
		
		wFilenameList = new TableView(transMeta,this, 
						      SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER, 
						      colinfo, 
						      2,  
						      lsMod,
							  props
						      );
 		props.setLook(wFilenameList);
		fdFilenameList=new FormData();
		fdFilenameList.left   = new FormAttachment(middle, 0);
		fdFilenameList.right  = new FormAttachment(wbdFilename, -margin);
		fdFilenameList.top    = new FormAttachment(wExcludeFilemask, margin);
		fdFilenameList.bottom = new FormAttachment(wbShowFiles, -margin);
		wFilenameList.setLayoutData(fdFilenameList);

		
		fdFileComp=new FormData();
		fdFileComp.left  = new FormAttachment(0, 0);
		fdFileComp.top   = new FormAttachment(0, 0);
		fdFileComp.right = new FormAttachment(100, 0);
		fdFileComp.bottom= new FormAttachment(100, 0);
		this.setLayoutData(fdFileComp);
	
		this.layout();
//		wFileTab.setControl(wFileComp);
		
		/////////////////////////////////////////////////////////////
		/// END OF FILE TAB
		/////////////////////////////////////////////////////////////
		
		
		// Add the file to the list of files...
		SelectionAdapter selA = new SelectionAdapter()
		{
			public void widgetSelected(SelectionEvent arg0)
			{
				wFilenameList.add(new String[] { wFilename.getText(), wFilemask.getText(), wExcludeFilemask.getText(),XMLTransferDataMeta.RequiredFilesCode[0],XMLTransferDataMeta.RequiredFilesCode[0]} );
				wFilename.setText("");
				wFilemask.setText("");
				wExcludeFilemask.setText("");
				wFilenameList.removeEmptyRows();
				wFilenameList.setRowNums();
                wFilenameList.optWidth(true);
			}
		};
		wbaFilename.addSelectionListener(selA);
		wFilename.addSelectionListener(selA);
		
		// Delete files from the list of files...
		wbdFilename.addSelectionListener(new SelectionAdapter()
		{
			public void widgetSelected(SelectionEvent arg0)
			{
				int idx[] = wFilenameList.getSelectionIndices();
				wFilenameList.remove(idx);
				wFilenameList.removeEmptyRows();
				wFilenameList.setRowNums();
			}
		});

		// Edit the selected file & remove from the list...
		wbeFilename.addSelectionListener(new SelectionAdapter()
		{
			public void widgetSelected(SelectionEvent arg0)
			{
				int idx = wFilenameList.getSelectionIndex();
				if (idx>=0)
				{
					String string[] = wFilenameList.getItem(idx);
					wFilename.setText(string[0]);
					wFilemask.setText(string[1]);
					wExcludeFilemask.setText(string[2]);
					wFilenameList.remove(idx);
				}
				wFilenameList.removeEmptyRows();
				wFilenameList.setRowNums();
			}
		});

		// Show the files that are selected at this time...
		wbShowFiles.addSelectionListener(new SelectionAdapter() 
			{
				public void widgetSelected(SelectionEvent e) 
				{
                    try
                    {
                    	XMLTransferDataMeta tfii = new XMLTransferDataMeta();
    					getInfo(tfii);
                        FileInputList fileInputList = tfii.getFiles(transMeta);
    					String files[] = fileInputList.getFileStrings();
    					if (files!=null && files.length>0)
    					{
    						EnterSelectionDialog esd = new EnterSelectionDialog(shell, files, BaseMessages.getString(PKG, "GetXMLDataDialog.FilesReadSelection.DialogTitle"), BaseMessages.getString(PKG, "GetXMLDataDialog.FilesReadSelection.DialogMessage"));
    						esd.setViewOnly();
    						esd.open();
    					}
    					else
    					{
    						MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR );
    						mb.setMessage(BaseMessages.getString(PKG, "GetXMLDataDialog.NoFileFound.DialogMessage"));
    						mb.setText(BaseMessages.getString(PKG, "System.Dialog.Error.Title"));
    						mb.open(); 
    					}
                    }
                    catch(KettleException ex)
                    {
                        new ErrorDialog(shell, BaseMessages.getString(PKG, "GetXMLDataDialog.ErrorParsingData.DialogTitle"), BaseMessages.getString(PKG, "GetXMLDataDialog.ErrorParsingData.DialogMessage"), ex);
                    }
				}
			}
		);

		// Whenever something changes, set the tooltip to the expanded version of the filename:
		wFilename.addModifyListener(new ModifyListener()
			{
				public void modifyText(ModifyEvent e)
				{
					wFilename.setToolTipText(wFilename.getText());
				}
			}
		);

		// Listen to the Browse... button
		wbbFilename.addSelectionListener
		(
			new SelectionAdapter()
			{
				public void widgetSelected(SelectionEvent e) 
				{
					if (!Const.isEmpty(wFilemask.getText()) || !Const.isEmpty(wExcludeFilemask.getText())) // A mask: a directory!
					{
						DirectoryDialog dialog = new DirectoryDialog(shell, SWT.OPEN);
						if (wFilename.getText()!=null)
						{
							String fpath = transMeta.environmentSubstitute(wFilename.getText());
							dialog.setFilterPath( fpath );
						}
						
						if (dialog.open()!=null)
						{
							String str= dialog.getFilterPath();
							wFilename.setText(str);
						}
					}
					else
					{
						FileDialog dialog = new FileDialog(shell, SWT.OPEN);
						dialog.setFilterExtensions(new String[] {"*.xml;*.XML", "*"});
						if (wFilename.getText()!=null)
						{
							String fname = transMeta.environmentSubstitute(wFilename.getText());
							dialog.setFileName( fname );
						}
						
						dialog.setFilterNames(new String[] {BaseMessages.getString(PKG, "System.FileType.XMLFiles"), BaseMessages.getString(PKG, "System.FileType.AllFiles")});
						
						if (dialog.open()!=null)
						{
							String str = dialog.getFilterPath()+System.getProperty("file.separator")+dialog.getFileName();
							wFilename.setText(str);
						}
					}
				}
			}
		);
		
		
		getData(input);
		
	}
	
	private void setXMLStreamField()
	 {
		 try{
	           
			 wXMLField.removeAll();
				
			 RowMetaInterface r = transMeta.getPrevStepFields(stepname);
				if (r!=null)
				{
		             r.getFieldNames();
		             
		             for (int i=0;i<r.getFieldNames().length;i++)
						{	
		            	 wXMLField.add(r.getFieldNames()[i]);					
							
						}
				}
		 }catch(KettleException ke){
				new ErrorDialog(shell, BaseMessages.getString(PKG, "GetXMLDataDialog.FailedToGetFields.DialogTitle"), BaseMessages.getString(PKG, "GetXMLDataDialog.FailedToGetFields.DialogMessage"), ke); //$NON-NLS-1$ //$NON-NLS-2$
			}
	 }
	private void ActiveXmlStreamField()
	{		
		wlXMLField.setEnabled(wXMLStreamField.getSelection());
		wXMLField.setEnabled(wXMLStreamField.getSelection());
		wlXMLIsAFile.setEnabled(wXMLStreamField.getSelection());
		wXMLIsAFile.setEnabled(wXMLStreamField.getSelection());
		wlreadUrl.setEnabled(wXMLStreamField.getSelection());
		wreadUrl.setEnabled(wXMLStreamField.getSelection());
			
		wlFilename.setEnabled(!wXMLStreamField.getSelection());
		wbbFilename.setEnabled(!wXMLStreamField.getSelection());
		wbaFilename.setEnabled(!wXMLStreamField.getSelection());		
		wFilename.setEnabled(!wXMLStreamField.getSelection());	
		wlExcludeFilemask.setEnabled(!wXMLStreamField.getSelection());		
		wExcludeFilemask.setEnabled(!wXMLStreamField.getSelection());	
		wlFilemask.setEnabled(!wXMLStreamField.getSelection());		
		wFilemask.setEnabled(!wXMLStreamField.getSelection());		
		wlFilenameList.setEnabled(!wXMLStreamField.getSelection());		
		wbdFilename.setEnabled(!wXMLStreamField.getSelection());
		wbeFilename.setEnabled(!wXMLStreamField.getSelection());
		wbShowFiles.setEnabled(!wXMLStreamField.getSelection());
		wlFilenameList.setEnabled(!wXMLStreamField.getSelection());
		wFilenameList.setEnabled(!wXMLStreamField.getSelection());
//		wInclFilename.setEnabled(!wXMLStreamField.getSelection());
//		wlInclFilename.setEnabled(!wXMLStreamField.getSelection());
//		
//		if(wXMLStreamField.getSelection())
//		{
//			wInclFilename.setSelection(false);
//			wlInclFilenameField.setEnabled(false);
//			wInclFilenameField.setEnabled(false);
//		}else
//		{
//			wlInclFilenameField.setEnabled(wInclFilename.getSelection());
//			wInclFilenameField.setEnabled(wInclFilename.getSelection());
//		}
//		
//		if(wXMLStreamField.getSelection() && !wXMLIsAFile.getSelection())
//		{
//			wEncoding.setEnabled(false);
//			wlEncoding.setEnabled(false);
//		}
//		else
//		{
//			wEncoding.setEnabled(true);
//			wlEncoding.setEnabled(true);	
//		}
//		wAddResult.setEnabled(!wXMLStreamField.getSelection());
//		wlAddResult.setEnabled(!wXMLStreamField.getSelection());
//		wLimit.setEnabled(!wXMLStreamField.getSelection());	
//		wlLimit.setEnabled(!wXMLStreamField.getSelection());
//		wPreview.setEnabled(!wXMLStreamField.getSelection());
//		wGet.setEnabled(!wXMLStreamField.getSelection());
//		wbbLoopPathList.setEnabled(!wXMLStreamField.getSelection());
//		wPrunePath.setEnabled(!wXMLStreamField.getSelection());
//		wlPrunePath.setEnabled(!wXMLStreamField.getSelection());
//		wlShortFileFieldName.setEnabled(!wXMLStreamField.getSelection());
//		wShortFileFieldName.setEnabled(!wXMLStreamField.getSelection());
//		wlPathFieldName.setEnabled(!wXMLStreamField.getSelection());
//		wPathFieldName.setEnabled(!wXMLStreamField.getSelection());
//		wlIsHiddenName.setEnabled(!wXMLStreamField.getSelection());
//		wIsHiddenName.setEnabled(!wXMLStreamField.getSelection());
//		wlLastModificationTimeName.setEnabled(!wXMLStreamField.getSelection());
//		wLastModificationTimeName.setEnabled(!wXMLStreamField.getSelection());
//		wlUriName.setEnabled(!wXMLStreamField.getSelection());
//		wUriName.setEnabled(!wXMLStreamField.getSelection());
//		wlRootUriName.setEnabled(!wXMLStreamField.getSelection());
//		wRootUriName.setEnabled(!wXMLStreamField.getSelection());
//		wlExtensionFieldName.setEnabled(!wXMLStreamField.getSelection());
//		wExtensionFieldName.setEnabled(!wXMLStreamField.getSelection());
//		wlSizeFieldName.setEnabled(!wXMLStreamField.getSelection());
//		wSizeFieldName.setEnabled(!wXMLStreamField.getSelection());
//		if(wXMLStreamField.getSelection()) {
//			wShortFileFieldName.setText("");
//			wPathFieldName.setText("");
//			wIsHiddenName.setText("");
//			wLastModificationTimeName.setText("");
//			wUriName.setText("");
//			wRootUriName.setText("");
//			wExtensionFieldName.setText("");
//			wSizeFieldName.setText("");
//
//		}
		
	}
	
	
	public void getInfo(XMLTransferDataMeta in) throws KettleException
	{
//		stepname = wStepname.getText(); // return value
//
//		// copy info to TextFileInputMeta class (input)
//		in.setRowLimit( Const.toLong(wLimit.getText(), 0L) );
//		in.setPrunePath(wPrunePath.getText());
//        in.setLoopXPath(wLoopXPath.getText());
//        in.setEncoding(wEncoding.getText());
//		in.setFilenameField( wInclFilenameField.getText() );
//		in.setRowNumberField( wInclRownumField.getText() );
//		in.setAddResultFile( wAddResult.getSelection() );	
//		in.setIncludeFilename( wInclFilename.getSelection() );
//		in.setIncludeRowNumber( wInclRownum.getSelection() );
//		in.setNamespaceAware( wNameSpaceAware.getSelection() );
//		in.setReadUrl(wreadUrl.getSelection() );
//		in.setIgnoreComments(wIgnoreComment.getSelection() );
//		in.setValidating( wValidating.getSelection() );
//		in.setuseToken(wuseToken.getSelection() );
//		in.setIgnoreEmptyFile(wIgnoreEmptyFile.getSelection() );
//		in.setdoNotFailIfNoFile(wdoNotFailIfNoFile.getSelection());
//		
//		in.setInFieldsT(wXMLStreamField.getSelection());
//		in.setIsAFileT(wXMLIsAFile.getSelection());
//		in.setXMLFieldT(wXMLField.getText());
		
		int nrFiles     = wFilenameList.getItemCount();
		int nrFields    = wFilenameList.nrNonEmpty();
		
		in.allocateT(nrFiles, nrFields);
		in.setFileNameT( wFilenameList.getItems(0) );
		in.setFileMaskT( wFilenameList.getItems(1) );
		
//		in.setExcludeFileMask(wFilenameList.getItems(2) );
//		in.setFileRequired(wFilenameList.getItems(3));
//		in.setIncludeSubFolders(wFilenameList.getItems(4));

//		for (int i=0;i<nrFields;i++)
//		{
//			XMLTransferDataField field = new XMLTransferDataField();
//		    
//			TableItem item  = wFields.getNonEmpty(i);
//            
//			field.setName( item.getText(1) );
//			field.setXPath( item.getText(2) );
//			field.setElementType( XMLTransferDataField.getElementTypeByDesc(item.getText(3)) );
//			field.setType( ValueMeta.getType(item.getText(4)) );
//			field.setFormat( item.getText(5) );
//			field.setLength( Const.toInt(item.getText(6), -1) );
//			field.setPrecision( Const.toInt(item.getText(7), -1) );
//			field.setCurrencySymbol( item.getText(8) );
//			field.setDecimalSymbol( item.getText(9) );
//			field.setGroupSymbol( item.getText(10) );
//			field.setTrimType( XMLTransferDataField.getTrimTypeByDesc(item.getText(11)) );
//			field.setRepeated( BaseMessages.getString(PKG, "System.Combo.Yes").equalsIgnoreCase(item.getText(12)) );		
//            
//			in.getInputFields()[i] = field;
//		}		
//        in.setShortFileNameField(wShortFileFieldName.getText());
//        in.setPathField(wPathFieldName.getText());
//        in.setIsHiddenField(wIsHiddenName.getText());
//        in.setLastModificationDateField(wLastModificationTimeName.getText());
//        in.setUriField(wUriName.getText());
//        in.setRootUriField(wRootUriName.getText());
//        in.setExtensionField(wExtensionFieldName.getText());
//        in.setSizeField(wSizeFieldName.getText());
		
	}
	
	
	public void getData(XMLTransferDataMeta in)
	{
		if (in.getFileNameT() !=null) 
		{
			wFilenameList.removeAll();
			
			for (int i=0;i<in.getFileNameT().length;i++) 
			{
				wFilenameList.add(new String[] { in.getFileNameT()[i], in.getFileMaskT()[i] , in.getExludeFileMask()[i],
						in.getRequiredFilesDesc(in.getFileRequired()[i]), in.getRequiredFilesDesc(in.getIncludeSubFolders()[i])} );
			}
			
			wFilenameList.removeEmptyRows();
			wFilenameList.setRowNums();
			wFilenameList.optWidth(true);
		}
		
		wreadUrl.setSelection(in.isReadUrl());
		wXMLStreamField.setSelection(in.isInFields());
		wXMLIsAFile.setSelection(in.getIsAFile());
		
		if (in.getXMLField()!=null) wXMLField.setText(in.getXMLField());
		
				
//		for (int i=0;i<in.getInputFields().length;i++)
//		{
//			XMLTransferDataField field = in.getInputFields()[i];
//		    
//            if (field!=null)
//            {
//    			TableItem item = wFields.table.getItem(i);
//    			String name     = field.getName();
//    			String xpath	= field.getXPath();
//    			String element  = field.getElementTypeDesc();
//    			String type     = field.getTypeDesc();
//    			String format   = field.getFormat();
//    			String length   = ""+field.getLength();
//    			String prec     = ""+field.getPrecision();
//    			String curr     = field.getCurrencySymbol();
//    			String group    = field.getGroupSymbol();
//    			String decim    = field.getDecimalSymbol();
//    			String trim     = field.getTrimTypeDesc();
//    			String rep      = field.isRepeated()?BaseMessages.getString(PKG, "System.Combo.Yes"):BaseMessages.getString(PKG, "System.Combo.No");
//    			
//                if (name    !=null) item.setText( 1, name);
//                if (xpath   !=null) item.setText( 2, xpath);
//                if (element !=null) item.setText( 3, element);
//    			if (type    !=null) item.setText( 4, type    );
//    			if (format  !=null) item.setText( 5, format  );
//    			if (length  !=null && !"-1".equals(length  )) item.setText( 6, length  );
//    			if (prec    !=null && !"-1".equals(prec    )) item.setText( 7, prec    );
//    			if (curr    !=null) item.setText( 8, curr    );
//    			if (decim   !=null) item.setText( 9, decim   );
//    			if (group   !=null) item.setText( 10, group   );
//    			if (trim    !=null) item.setText( 11, trim    );
//    			if (rep     !=null) item.setText(12, rep     );
//                
//            }
//		}     
       

	}
	
}
